package Day_0203.Mybatis;

/**
 * @author zxc
 * @date 2023/02/03 17:24
 **/
public class Mybatis_Delayed_Loading {
    public static void main(String[] args) {
        /**
         * Mybatis是否支持延迟加载 && 请简述延迟加载的原理
         * ===》
         * 1.Mybatis仅支持association关联对象和collection关联集合对象的延迟加载，
         * （1）association指的就是一对一查询，
         * （2）collection指的就是一对多查询。
         * （3）在Mybatis配置文件中，可以配置是否启用延迟加载lazyLoadingEnabled=true|false。
         *
         * 2.原理：
         * （1）使用CGLIB创建目标对象的代理对象，
         * （2）当调用目标方法时，进入拦截器方法，
         *  比如调用a.getB().getName()，拦截器invoke()方法发现a.getB()是null值，
         *  那么就会单独发送事先保存好的查询关联B对象的sql，把B查询上来，然后调用a.setB(b)，
         *  于是a的对象b属性就有值了，接着完成a.getB().getName()方法的调用。
         *
         * ===》
         *  总结 ：不光是Mybatis，几乎所有的包括Hibernate，支持延迟加载的原理都是一样的。
         */
    }
}
